﻿using System;
using System.Collections.Generic;
using System.Linq;
using RFMS;

namespace BU
{
    public class Artikel
    {
        private readonly ModelRFMSContainer _container;

        public Artikel()
        {
            _container = ModelRFMSContainer.GetInstance();
        }

        public string Naam { get; set; }
        public string Prijs { get; set; }
        public string Btw { get; set; }
        public bool Actief { get; set; }

        public void Toevoegen(string naam, double prijs, int btw, string subCategorieNaam)
        {
            var art = new RFMS.Artikel();
            RFMS.SubCategorie subCat = SubCategorieId(subCategorieNaam);
            art.Naam = naam;
            art.Prijs = prijs;
            art.BTW = btw;
            art.SubCategorie = subCat;
            art.Actief = true;
            _container.ArtikelSet.AddObject(art);
            _container.SaveChanges();
        }

        public void ArtikelActiveren(string naam, bool waarde)
        {
            RFMS.Artikel artikel = _container.ArtikelSet.FirstOrDefault(p => p.Naam == naam);
            artikel.Actief = waarde;
            _container.SaveChanges();
        }

        public double HaalPrijsOp(string naam)
        {
            var art = new double();

            IQueryable<RFMS.Artikel> test = from t in _container.ArtikelSet
                                            where t.Naam == naam
                                            select t;
            foreach (RFMS.Artikel artikel in test)
            {
                art = artikel.Prijs;
            }
            return art;
        }

        private RFMS.SubCategorie SubCategorieId(string subCategorie)
        {
            var cat = new RFMS.SubCategorie();

            IQueryable<RFMS.SubCategorie> test = from t in _container.SubCategorieSet
                                                 where t.Naam == subCategorie
                                                 select t;
            foreach (RFMS.SubCategorie text in test)
            {
                cat = text;
            }
            return cat;
        }

        public void Verwijderen(string naam)
        {
            try
            {
                RFMS.Artikel artikel = _container.ArtikelSet.FirstOrDefault(p => p.Naam == naam);
                artikel.Actief = false;
                _container.SaveChanges();
            }
            catch (Exception)
            {
                
            }
        }

        public void AanpassenNaam(string naam, string nieuweNaam)
        {
            RFMS.Artikel artikel = _container.ArtikelSet.FirstOrDefault(p => p.Naam == naam);
            artikel.Naam = nieuweNaam;
            _container.SaveChanges();
        }

        public void Wijzigen(string naam, string nieuwenaam, string subCategorie, double nieuwePrijs, int nieuweBtw)
        {
            RFMS.Artikel artikel = _container.ArtikelSet.FirstOrDefault(p => p.Naam == naam);
            if(nieuwenaam != "")
            {
                artikel.Naam = nieuwenaam;
            }
            artikel.Prijs = nieuwePrijs;
            RFMS.SubCategorie subCat = SubCategorieId(subCategorie);
            artikel.SubCategorie = subCat;
            artikel.BTW = nieuweBtw;
            _container.SaveChanges();
        }

        public List<List<string>> LijstVanProducten(string subcategorie)
        {
            var lijst = new List<List<string>>();

            IQueryable<RFMS.Artikel> art = from t in _container.ArtikelSet
                                           where t.SubCategorie.Naam == subcategorie && t.Actief
                                           select t;
            foreach (RFMS.Artikel s in art)
            {
                lijst.Add(new List<string>
                              {
                                  s.ArtikelId.ToString(),
                                  s.Naam,
                                  s.Prijs.ToString(),
                                  s.BTW.ToString(),
                                  s.SubCategorie.Categorie.Naam,
                                  s.SubCategorie.Naam,
                                  s.SubCategorie.Categorie.Locatie
                              });
            }

            return lijst;
        }

        public List<List<string>> LijstVanProducten()
        {
            var lijst = new List<List<string>>();

            IQueryable<RFMS.Artikel> art = from a in _container.ArtikelSet
                                           where a.Actief
                                           select a;
            foreach (RFMS.Artikel s in art)
            {
                lijst.Add(new List<string>
                              {
                                  s.ArtikelId.ToString(),
                                  s.Naam,
                                  s.Prijs.ToString(),
                                  s.BTW.ToString(),
                                  s.SubCategorie.Categorie.Naam,
                                  s.SubCategorie.Naam,
                                  s.SubCategorie.Categorie.Locatie
                              });
            }

            return lijst;
        }

        public List<List<string>> LijstVanAlleArtikelen()
        {
            IQueryable<RFMS.Artikel> artikelen = from c in _container.ArtikelSet
                                                 select c;

            var lijst = new List<List<string>>();

            foreach (RFMS.Artikel art in artikelen)
            {
                lijst.Add(new List<string> {art.ArtikelId.ToString(), art.Naam, art.Actief.ToString()});
            }

            return lijst;
        }
    }
}